//  cesium 混合图层 dom 图层
import * as Cesium from 'cesium'

// 下面的注释不是刚写代码时候的，是后来加的，正确性待验证
export function createDataSourceLayer(viewer = window.viewer) {
    const cds = new Cesium.CustomDataSource()
    const compositeEntityCollection = new Cesium.CompositeEntityCollection()
    const defaultEntityCollection = new Cesium.EntityCollection()
    compositeEntityCollection.addCollection(defaultEntityCollection)
    //cds.entities 现在是一个compositeEntityCollection，它可以添加entityCollection作为元素，这样一个dataSource可以有多个entityCollection
    // 下面这行 _entityCollection在源代码中看到的，没找到直接赋值方法
    cds._entityCollection = compositeEntityCollection
    //cds.entityCollection初始化一个entityCollection， 便于使用, 这里添加的entity也放在cds.entities 里面
    cds.entityCollection = defaultEntityCollection
    viewer.dataSources.add(cds)
    return cds
}

/*
控制CustomDataSource中entity的显示隐藏,必须通过 CompositeEntityCollection(entities) 来控制,
直接控制EntityCollection是无效的,即使EntityCollection添加到CompositeEntityCollection中也是无效的
通过EntityCollection添加的entity,再用
EntityCollection.contains(entity) 也是无效的,只能通过CompositeEntityCollection.contains(entity)来判断
cesium 设计CompositeEntityCollection 可以包含EntityCollection有什么用啊？
个人引入 CompositeEntityCollection 和 EntityCollection 是希望可以通过多个EntityCollection进行细粒度的控制 ，但现在
还是通过一个入口CompositeEntityCollection来控制。没有达到初衷。
通过 EntityCollection.add(entity) 最终还是添加到CompositeEntityCollection中,但遍历这两个集合时,
交叉contains 都是 false,说明两个集合中的entity不是同一个对象.

CompositeEntityCollection也能进行某些细粒度的控制， removeCollection(collection) 可以清除此collection中的entity,
还有,raiseCollection(collection),lowerCollectionToBottom(collection),removeAllCollections(),
但是操作具体的修改entity还是需要通过CompositeEntityCollection来操作,如果只是读属性可以通过EntityCollection来操作



遍历CompositeEntityCollection EntityCollection.contains(entity) 为false, 但是entity.show = false 有效
遍历EntityCollection EntityCollection.contains(entity) 为true, 但是entity.show = false 无效
所以entityCollection添加的entity 通过CompositeEntityCollection来控制显示隐藏
遍历EntityCollection时,操作entity 会报错  --> Cannot set property isShowing of #<Entity> which has only a getter
EntityCollection就像一个只读的集合，只能通过CompositeEntityCollection来操作

    下面有博客链接，可以参考
https://blog.csdn.net/GhostPaints/article/details/126010465

                */

export function createMixedLayer(viewer = window.viewer) {
    return {
        dataSourceLayer: createDataSourceLayer(viewer),
        domLayer: [],
        primitiveLayer: viewer.scene.primitives.add(
            new Cesium.PrimitiveCollection()
        ),
        destroyCallback: [],
        destroy() {
            viewer.dataSources.remove(this.dataSourceLayer, true)
            this.domLayer.forEach((dom) => dom.destroy())

            viewer.scene.primitives.remove(this.primitiveLayer)
            this.primitiveLayer.destroy()

            Object.values(this.destroyCallback).forEach((callback) =>
                callback()
            )
        },
        toggle(flag) {
            this.dataSourceLayer.entities.values.forEach((entity) => {
                entity.show = flag
            })
            this.domLayer.forEach((domEntity) => {
                domEntity.show = flag
            })
            const { primitiveLayer } = this
            for (let i = 0; i < primitiveLayer.length; i++) {
                primitiveLayer.get(i).show = flag
            }
        },
    }
}
